import dayjs from 'dayjs'

/**
 * 校验日期是否合法
 */
function validateDate(date: string): boolean {
  const d = dayjs(date)
  if (!d.isValid()) {
    console.error(`时间格式不正确: ${date}`)
    return false
  }
  return true
}

/** 减指定天数 */
export function subDay(date: string, days: number, format: string = 'YYYY-MM-DD'): string {
  const d = validateDate(date)
  return d ? dayjs(date).subtract(days, 'day').format(format) : date
}

/** 加指定天数 */
export function addDay(date: string, days: number, format: string = 'YYYY-MM-DD'): string {
  const d = validateDate(date)
  return d ? dayjs(date).add(days, 'day').format(format) : date
}

/**
 * 将秒数转换为友好的时间单位表示
 * @param {number} seconds - 秒数
 * @param {Object} options - 格式化选项
 * @param {boolean} [options.showSeconds=true] - 是否显示秒
 * @param {boolean} [options.fuzzy=false] - 是否使用模糊模式（如"年以上"）
 * @returns {string} 格式化后的时间字符串
 */
export const formatDuration = (seconds, options: any = {}) => {
  if (seconds == null || isNaN(seconds) || seconds < 0) return ''

  const { showSeconds = true, fuzzy = false } = options

  // 时间单位转换
  const minutes = Math.floor(seconds / 60)
  const hours = Math.floor(minutes / 60)
  const days = Math.floor(hours / 24)
  const months = Math.floor(days / 30)
  const years = Math.floor(months / 12)

  // 剩余单位计算
  const remainingMonths = months % 12
  const remainingDays = days % 30
  const remainingHours = hours % 24
  const remainingMinutes = minutes % 60
  // const remainingSeconds = seconds % 60

  // 构建时间片段
  const segments: any = []

  // 年
  if (years > 0) {
    segments.push(`${years}年`)
    if (!fuzzy && remainingMonths > 0) segments.push(`${remainingMonths}月`)
    else if (fuzzy) return `${years}年以上`
  }
  // 月
  else if (months > 0) {
    segments.push(`${months}月`)
    if (!fuzzy && remainingDays > 0) segments.push(`${remainingDays}天`)
    else if (fuzzy) return `${months}个月以上`
  }
  // 天
  else if (days > 0) {
    segments.push(`${days}天`)
    if (remainingHours > 0) segments.push(`${remainingHours}小时`)
  }
  // 小时
  else if (hours > 0) {
    segments.push(`${hours}小时`)
    if (remainingMinutes > 0) segments.push(`${remainingMinutes}分钟`)
  }
  // 分钟
  else if (minutes > 0) {
    segments.push(`${minutes}分钟`)
  }
  // 秒
  else if (showSeconds) {
    segments.push(`${seconds === 0 ? 0 : seconds}秒`)
  }

  return segments.join('')
}

export const getDuration = (second) => {
  console.log(second)
  const minutes = Math.round(second / 1000 / 60)
  const hours = Math.round(minutes / 60)
  const days = Math.round(hours / 24)
  // let months = Math.round(days / 30);
  // let years = Math.round(months / 12);
  let oldValue = ''
  if (days > 0) {
    // 几天前
    oldValue = days + '天' + (hours - 24 * days) + '小时' + (minutes - 60 * hours) + '分'
  } else {
    if (hours > 0) {
      // 几小时前
      oldValue = hours + '小时' + (minutes - 60 * hours) + '分'
    } else {
      // 这里  您可以处理一个  刚刚  比如时间小于30分钟
      if (minutes > 0) {
        // 几分钟前
        oldValue = minutes + 'min'
      } else {
        // 几秒前
        oldValue = '<1min'
      }
    }
  }
  return oldValue
}

// 根据毫秒转换时间
export const formatDuration_ms = (seconds) => {
  const daySec = 24 * 60 * 60 * 1000
  const hourSec = 60 * 60 * 1000
  const minuteSec = 60 * 1000
  const dd = Math.round(seconds / daySec)
  const hh = Math.round((seconds % daySec) / hourSec)
  const mm = Math.round((seconds % hourSec) / minuteSec)
  const ss = seconds % minuteSec
  if (dd > 0) {
    return dd + '天' + hh + '小时'
  } else if (hh > 0) {
    return hh + '小时' + mm + '分钟'
  } else if (mm > 0) {
    return mm + '分钟'
  } else {
    return ss + '秒'
  }
}

// $fenZu
export const formatDuration_group = function (arr, group_key) {
  // 根据参数分组
  // 先定义一个空对象和空数组；
  const map = {}
  const res: any = []
  // 循环需要筛选的数组
  for (let i = 0; i < arr.length; i++) {
    const ai = arr[i]
    // 将需要筛选的属性的值作为新对象的键，并且判断是否已经存在
    if (!map[ai[group_key]]) {
      // 不存在的话就在map对象中创建一个属性的值作为键名，键值为空数组的新对象，并且把arr[i]放入
      map[ai[group_key]] = [ai]
    } else {
      // 如果已经存在就直接把arr[i]放入
      map[ai[group_key]].push(ai)
    }
  }
  // 循环后对map进行处理生成分组的数组
  Object.keys(map).forEach((key) => {
    res.push({
      [group_key]: key,
      list: map[key]
    })
  })
  return res
}
